home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / Sessions / Completions / Completions Source / Execution Queues / DeferredTaskTime.cp < prev    next >
Encoding:
Text File  |  1998-06-17  |  1.1 KB  |  59 lines  |  [TEXT/CWIE]

  1. // DeferredTaskTime.cp
  2.  
  3. #ifndef DeferredTaskTime_h
  4. #include "DeferredTaskTime.h"
  5. #endif
  6. #ifndef Procedure_h
  7. #include "Procedure.h"
  8. #endif
  9. #ifndef Deferer_h
  10. #include "Deferer.h"
  11. #endif
  12. #ifndef __TIMER__
  13. #include <Timer.h>
  14. #endif
  15.  
  16. bool DeferredTaskTime::isNow = false;
  17.  
  18. void DeferredTaskTime::Execute( DeferredTaskTimeProcedure& action )
  19.   {
  20.     if ( IsNow() )
  21.       {
  22.         action( DeferredTaskTime() );
  23.         return;
  24.       }
  25.  
  26.     static Deferer deferer;
  27.     deferer.Defer( action );
  28.         
  29.     TryToCauseInterrupt();
  30.             
  31.     while ( !deferer.Pending() )
  32.         ;
  33.   }
  34.  
  35. pascal void DeferredTaskTime::DoNothing()
  36.   {
  37.   }
  38.  
  39. void DeferredTaskTime::TryToCauseInterrupt()
  40.   {
  41.     #if GENERATINGCFM
  42.         static RoutineDescriptor DoNothing =
  43.             BUILD_ROUTINE_DESCRIPTOR( uppTimerProcInfo, DeferredTaskTime::DoNothing );
  44.     #endif
  45.  
  46.     TMTask timeTask;
  47.     timeTask.tmAddr = &DoNothing;
  48.     timeTask.tmWakeUp = 0;
  49.     
  50.     InsTime( reinterpret_cast<QElem *>( &timeTask ) );
  51.     PrimeTime( reinterpret_cast<QElem *>( &timeTask ), -1 );
  52.     
  53.     volatile TMTask& volatileTask( timeTask );
  54.     while ( (volatileTask.qType & 0x8000) != 0 )
  55.         ;
  56.     
  57.     RmvTime( reinterpret_cast<QElem *>( &timeTask ) );
  58.   }
  59.